unit DuplicataReceberDM;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ZDataset, ZSqlUpdate, ZSequence, MainDM, QueryConditions, DB;

type

  { TDuplicataReceberData }

  TDuplicataReceberData = class(TMainDataModule)
    DuplicataAntesDatasource: TDatasource;
    DuplicataAntesZQueryacrescimo: TFloatField;
    DuplicataAntesZQuerydata_pagamento: TDateField;
    DuplicataAntesZQuerydata_vencimento: TDateField;
    DuplicataAntesZQuerydesconto: TFloatField;
    DuplicataAntesZQueryid_cliente: TLargeintField;
    DuplicataAntesZQueryid_conta: TLargeintField;
    DuplicataAntesZQueryid_duplicata_receber: TLargeintField;
    DuplicataAntesZQueryid_venda: TLargeintField;
    DuplicataAntesZQuerynota: TStringField;
    DuplicataAntesZQueryparcela: TLargeintField;
    DuplicataAntesZQuerysigla_forma_pagamento: TStringField;
    DuplicataAntesZQuerystatus: TStringField;
    DuplicataAntesZQueryvalor: TFloatField;
    DuplicataAntesZQueryvalor_pago: TFloatField;
    DuplicataDepoisDatasource: TDatasource;
    DuplicataDepoisZQueryacrescimo: TFloatField;
    DuplicataDepoisZQuerydata_pagamento: TDateField;
    DuplicataDepoisZQuerydata_vencimento: TDateField;
    DuplicataDepoisZQuerydesconto: TFloatField;
    DuplicataDepoisZQueryid_cliente: TLargeintField;
    DuplicataDepoisZQueryid_conta: TLargeintField;
    DuplicataDepoisZQueryid_duplicata_receber: TLargeintField;
    DuplicataDepoisZQueryid_venda: TLargeintField;
    DuplicataDepoisZQuerynota: TStringField;
    DuplicataDepoisZQueryparcela: TLargeintField;
    DuplicataDepoisZQuerysigla_forma_pagamento: TStringField;
    DuplicataDepoisZQuerystatus: TStringField;
    DuplicataDepoisZQueryvalor: TFloatField;
    DuplicataDepoisZQueryvalor_pago: TFloatField;
    DuplicataReceberDatasource: TDatasource;
    DuplicataReceberZQuery: TZQuery;
    AuxiliarZQuery: TZQuery;
    DuplicataReceberZQueryacrescimo: TFloatField;
    DuplicataReceberZQuerydata_pagamento: TDateField;
    DuplicataReceberZQuerydata_vencimento: TDateField;
    DuplicataReceberZQuerydesconto: TFloatField;
    DuplicataReceberZQueryid_caixa: TLargeintField;
    DuplicataReceberZQueryid_cliente: TLargeintField;
    DuplicataReceberZQueryid_conta: TLargeintField;
    DuplicataReceberZQueryid_duplicata_receber: TLargeintField;
    DuplicataReceberZQueryid_venda: TLargeintField;
    DuplicataReceberZQuerynome_pessoa: TStringField;
    DuplicataReceberZQuerynota: TStringField;
    DuplicataReceberZQueryparcela: TLargeintField;
    DuplicataReceberZQuerysigla_forma_pagamento: TStringField;
    DuplicataReceberZQuerystatus: TStringField;
    DuplicataReceberZQueryvalor: TFloatField;
    DuplicataReceberZQueryvalor_pago: TFloatField;
    DuplicataReceberZSequence: TZSequence;
    DuplicataReceberZUpdate: TZUpdateSQL;
    VendaCaixaDatasource: TDatasource;
    VendaCaixaZQuery: TZQuery;
    VendaCaixaZQueryid_caixa_movimentacao: TLargeintField;
    VendaCaixaZQueryid_usuario: TLargeintField;
    VendaCaixaZQueryid_venda: TLargeintField;
    VendaCaixaZQuerysigla_forma_pagamento: TStringField;
    VendaCaixaZQueryvalor: TFloatField;
    VendaCaixaZUpdate: TZUpdateSQL;
    DuplicataAntesZQuery: TZQuery;
    DuplicataDepoisZQuery: TZQuery;
    procedure DataModuleCreate(Sender: TObject);
    /// Abre o DataSet
    procedure OpenDataSet(); override;
    /// Fecha o DataSet
    procedure CloseDataSet(); override;
    /// Realiza busca
    /// @param(Condicoes são as condições para a busca)
    /// @param(Tabela é a tabela no banco de dados)
    procedure Search(Condicoes: TQueryConditions; Tabela: string); override;
    function BuscaIDCaixa(): string;
    function BuscaData(): string;
    procedure Limpa();
    procedure InsereBaixaConta(ValorPago: real; IDConta: string; IDUsuario: string);
    procedure CancelaDuplicata(IdDuplicata: integer; Parcela: integer);
    function BuscaDuplicata(IdDuplicata: integer; Parcela: integer): boolean;
    function BuscaDuplicatasRenegociacao(IDVenda: string): string;
    procedure GeraDuplicataReceberRenegociacao(IDVenda: integer;
      Data: TDate; IDCliente: integer; CondicaoPagamento: integer;
      Total: real; Acrescimo: real; IDCaixa: string);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  DuplicataReceberData: TDuplicataReceberData;

implementation

uses ConnectionDM;

{ TDuplicataReceberData }


procedure TDuplicataReceberData.DataModuleCreate(Sender: TObject);
begin
  MainDataSet := DuplicataReceberZQuery;
end;

procedure TDuplicataReceberData.OpenDataSet;
begin
  ConnectionData.EmptyQuery(DuplicataReceberZQuery, 'duplicata_receber');
end;

procedure TDuplicataReceberData.CloseDataSet;
begin
  DuplicataReceberZQuery.Close();
end;

procedure TDuplicataReceberData.Search(Condicoes: TQueryConditions; Tabela: string);
begin
  ConnectionData.OpenQueryConditions(DuplicataReceberZQuery, Tabela, Condicoes);
end;

function TDuplicataReceberData.BuscaDuplicata(IdDuplicata: integer;
  Parcela: integer): boolean;
begin
  with DuplicataReceberZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT p.nome_pessoa, dp.* FROM duplicata_receber as dp, pessoa as p ');
    SQL.Add('WHERE dp.id_duplicata_receber=:id_duplicata_receber AND dp.parcela=:parcela AND dp.id_cliente = p.id_pessoa');
    ParamByName('id_duplicata_receber').AsInteger := IdDuplicata;
    ParamByName('parcela').AsInteger := Parcela;
    Open();
    if RecordCount > 0 then begin
      Result := True;
    end else begin
      Result := False;
    end;
  end;
end;

function TDuplicataReceberData.BuscaData(): string;
var
  Data: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT current_date as date');
    Open();
    Data := FieldByName('date').AsString;
    Result := Data;
  end;
end;

procedure TDuplicataReceberData.Limpa;
begin
   with DuplicataReceberZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select * from duplicata_receber limit 0');
    Open();
    end;
end;

function TDuplicataReceberData.BuscaIDCaixa(): string;
var
  IDCaixa: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select id_caixa_movimentacao from caixa_movimentacao where status=:status');
    ParamByName('status').AsString := 'A';
    Open();
    if RecordCount > 0 then begin
      IDCaixa := FieldByName('id_caixa_movimentacao').AsString;
      Result := IDCaixa;
    end else begin
      Result := '';
    end;
  end;
end;


procedure TDuplicataReceberData.CancelaDuplicata(IdDuplicata: integer;
  Parcela: integer);
begin
  //A data de pagamento vai ser a data que foi cancelada
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('UPDATE duplicata_receber');
    SQL.Add('SET status =:status, data_pagamento = current_date');
    SQL.Add('WHERE id_duplicata_receber=:id_duplicata_receber AND parcela =:parcela');
    ParamByName('status').AsString := 'C';
    ParamByName('id_duplicata_receber').AsInteger := IDduplicata;
    ParamByName('parcela').AsInteger := Parcela;
    ExecSQL();
  end;
  with DuplicataReceberZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT * FROM duplicata_receber');
    SQL.Add('WHERE id_duplicata_receber=:id_duplicata_receber AND parcela =:parcela');
    ParamByName('id_duplicata_receber').AsInteger := IDduplicata;
    ParamByName('parcela').AsInteger := Parcela;
    Open();
  end;
end;

function TDuplicataReceberData.BuscaDuplicatasRenegociacao(IDVenda: string): string;
begin
  with DuplicataAntesZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT * FROM duplicata_receber as dp');
    SQL.Add('WHERE dp.id_venda =:id_venda AND dp.status =:A');
    ParamByName('id_venda').AsString := IDVenda;
    ParamByName('A').AsString := 'A';
    Open();
  end;
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT sum(dp.valor) as valor FROM duplicata_receber as dp');
    SQL.Add('WHERE dp.id_venda =:id_venda AND dp.status =:A');
    ParamByName('id_venda').AsString := IDVenda;
    ParamByName('A').AsString := 'A';
    Open();
    if (RecordCount > 0) then begin
      Result := FieldByName('valor').AsString;
    end else begin
      Result := '0';
    end;
  end;
  DuplicataReceberZQuery.Connection.StartTransaction;
end;

procedure TDuplicataReceberData.GeraDuplicataReceberRenegociacao(IDVenda: integer;
  Data: TDate; IDCliente: integer; CondicaoPagamento: integer; Total: real;
  Acrescimo: real; IDCaixa: string);
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('UPDATE duplicata_receber set status =:status,valor_pago = valor,data_pagamento=current_date');
    SQL.Add('where id_venda =:id_venda AND (status <>:statusQ AND status<>:statusC) AND sigla_forma_pagamento <>:cartao');
    ParamByName('id_venda').AsInteger := IDVenda;
    ParamByName('status').AsString := 'R';
    ParamByName('statusQ').AsString := 'Q';
    ParamByName('statusC').AsString := 'C';
    ParamByName('cartao').AsString := 'T';
    ExecSQL();
    Close();
    SQL.Clear();
    SQL.Add('INSERT INTO duplicata_receber(id_venda,data_vencimento,id_cliente,valor,parcela,sigla_pagamento)');
    SQL.add('SELECT :id_venda,:data_vencimento+cpp.dias,:id_cliente,(:acrescimo*cpp.porcentagem/100)+:valor*cpp.porcentagem/100,cpp.parcela,:sigla_forma_pagamento');
    SQL.Add('FROM condicao_pagamento_parcela as cpp');
    SQL.Add('WHERE cpp.id_condicao_pagamento=:id_condicao_pagamento');
    ParamByName('id_venda').AsInteger := IDVenda;
    ParamByName('data_vencimento').AsDate := Data;
    ParamByName('id_cliente').AsInteger := IDCliente;
    ParamByName('valor').AsFloat := Total;
    ParamByName('acrescimo').AsFloat := Acrescimo;
    ParamByName('id_condicao_pagamento').AsInteger := CondicaoPagamento;
    ParamByName('sigla_forma_pagamento').AsString := 'P';
    ExecSQL();
  end;
  with DuplicataDepoisZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT * FROM duplicata_receber where id_venda=:id_venda');
    SQL.Add('AND (status <>:statusQ AND status<>:statusC and status<>:statusR)');
    ParamByName('statusR').AsString := 'R';
    ParamByName('statusQ').AsString := 'Q';
    ParamByName('statusC').AsString := 'C';
    ParamByName('id_venda').AsInteger := IDVenda;
    Open();
    Edit();
  end;
end;

procedure TDuplicataReceberData.InsereBaixaConta(ValorPago: real;
  IDConta: string; IDUsuario: string);
var
  IDPlanoConta: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT valor FROM configuracao where desc_configuracao=:configuracao');
    ParamByName('configuracao').AsString := 'PLANO_CONTA PADRAO RECEBIMENTO DUPL';
    Open();
    IDPlanoConta := FieldByName('valor').AsString;
  end;
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('INSERT INTO plano_conta_movimentacao(id_conta,id_plano_conta,id_usuario,valor)');
    SQL.Add('VALUES(:id_conta,:id_plano_conta,:id_usuario,:valor);');
    ParamByName('id_conta').AsString := IDConta;
    ParamByName('id_plano_conta').AsString := IDPlanoConta;
    ParamByName('id_usuario').AsString := IDUsuario;
    ParamByName('valor').AsFloat := ValorPago;
    ExecSQL();
  end;
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('UPDATE conta');
    SQL.Add('SET saldo=saldo+:valor_pago where id_conta=:id_conta');
    ParamByName('id_conta').AsString := IDConta;
    ParamByName('valor_pago').AsFloat := ValorPago;
    ExecSQL();
  end;
end;

initialization
  {$I duplicatareceberdm.lrs}

end.
